import os
from pathlib import Path
import argparse
from word2md import Word2MD
import sys
import win32com.client
import time

def clean_path(path_str):
    """清理路径字符串"""
    # 移除开头和结尾的引号和空格
    path_str = path_str.strip()
    path_str = path_str.strip('"').strip("'")
    # 移除可能的 r 或 R 前缀
    if path_str.startswith(('r"', 'R"')):
        path_str = path_str[2:]
    if path_str.startswith(("r'", "R'")):
        path_str = path_str[2:]
    return path_str

def convert_doc_to_docx(doc_path):
    """将.doc文件转换为.docx格式"""
    try:
        # 确保路径是绝对路径
        abs_doc_path = os.path.abspath(str(doc_path))
        # 创建临时文件路径
        docx_path = abs_doc_path.replace('.doc', '.docx')
        
        if os.path.exists(docx_path):
            print(f"发现已存在的.docx文件: {docx_path}")
            return Path(docx_path)

        print(f"正在将.doc转换为.docx格式...")
        word = win32com.client.Dispatch('Word.Application')
        try:
            word.Visible = False  # 设置Word为不可见
            print(f"打开文件: {abs_doc_path}")
            doc = word.Documents.Open(abs_doc_path)
            print(f"保存为: {docx_path}")
            doc.SaveAs2(docx_path, FileFormat=16)  # 16 represents docx format
            doc.Close()
        finally:
            word.Quit()
        
        if not os.path.exists(docx_path):
            raise ValueError(f"转换失败：未能生成.docx文件")
            
        print(f"转换完成: {docx_path}")
        return Path(docx_path)
    except Exception as e:
        print(f"转换过程中的详细错误: {str(e)}")
        raise ValueError(f"转换.doc到.docx格式失败: {str(e)}")

def validate_file_path(file_path):
    """验证文件路径是否有效"""
    try:
        # 清理并转换路径
        clean_path_str = clean_path(file_path)
        path = Path(clean_path_str).resolve()
        
        if not path.exists():
            raise FileNotFoundError(f"文件不存在: {clean_path_str}")
        if not path.is_file():
            raise ValueError(f"路径不是一个文件: {clean_path_str}")
        if path.suffix.lower() not in ['.doc', '.docx']:
            raise ValueError(f"不支持的文件类型: {path.suffix}")
        
        # 如果是.doc文件，转换为.docx
        if path.suffix.lower() == '.doc':
            path = convert_doc_to_docx(path)
            
        return path
    except Exception as e:
        raise ValueError(f"无效的文件路径: {file_path}\n错误: {str(e)}")

def process_word_file(word_path, output_dir="outputs"):
    """处理Word文件转换"""
    try:
        # 规范化路径
        word_path = validate_file_path(word_path)
        output_dir = Path(output_dir)

        print(f"开始转换文件: {word_path}")
        print(f"输出目录: {output_dir}")

        # 创建转换器实例并执行转换
        converter = Word2MD(str(word_path), str(output_dir))
        converter.run()
        
        print(f"\n转换完成！")
        print(f"输出目录: {output_dir / word_path.stem}")
        print(f"Markdown文件: {output_dir / word_path.stem / (word_path.stem + '.md')}")
        print(f"图片目录: {output_dir / word_path.stem / 'images'}")
        
    except Exception as e:
        print(f"转换过程中出现错误: {str(e)}")
        raise

def main():
    # 如果没有参数，提供交互式输入
    if len(sys.argv) == 1:
        print("请输入Word文档路径 (.doc 或 .docx):")
        print("提示：直接复制完整的文件路径即可，无需添加引号或r前缀")
        word_path = input().strip()
        output_dir = "outputs"  # 使用默认输出目录
    else:
        # 创建命令行参数解析器
        parser = argparse.ArgumentParser(description='将Word文档转换为Markdown格式')
        parser.add_argument('word_path', type=str, help='Word文档路径 (.doc 或 .docx)')
        parser.add_argument('--output', '-o', type=str, default='outputs',
                          help='输出目录路径 (默认: outputs)')

        # 解析命令行参数
        args = parser.parse_args()
        word_path = args.word_path
        output_dir = args.output

    try:
        process_word_file(word_path, output_dir)
    except Exception as e:
        print(f"错误: {str(e)}")
        return 1
    return 0

if __name__ == "__main__":
    sys.exit(main())